from django.shortcuts import render
from django.http import HttpResponse
from django.core.urlresolvers import reverse
from django.contrib.auth.hashers import make_password, check_password
from myadmin import models
from myadmin.views.IndexViews import uploads
from web.settings import BASE_DIR
import os
# Create your views here.


# 首页
def index(request):
    # 获取所有的一级分类
    data = models.Types.objects.filter(pid = 0)
    for x in data:
        # 获取所有一级分类下相对应的 二级分类
        x.items = models.Types.objects.filter(pid=x.id)
    # 分配数据
    context = {'typtlist':data}

    # 查询热卖的商品
    hotlist = models.Goods.objects.filter(status=1)
    context['hotlist'] = hotlist
    return render(request,'home/index.html',context)

# 列表页
def home_list(request,tid):
    # 获取当前分类对象
    ob = models.Types.objects.get(id=tid)
    # 判断是一级分类还是二级分类
    if ob.pid == 0:
        # 一级分类
        """
         最终需要获取的数据 = {
             name(一级分类):手机,
             items(二级分类):[{子类1},{字类2}],
             goodslist(商品):[{子类1商品},{子类2商品}]
         }
        """
        data = ob
        # 获取当前分类的子类  子类的pid = 父类的 id 像当于 ob[items] = 值
        data.items = models.Types.objects.filter(pid=data.id)
        # 循环获得子类的 id 存入一个列表
        ids = []
        for i in data.items:       # i 为单个商品
            ids.append(i.id)
        # 获取子类下的所有商品  商品 tid 在 ids 里的 所有商品
        data.goodslist = models.Goods.objects.filter(tid__in=ids)
    else:
        # 二级分类
        # 获取当前分类的父类  父类的 id 为当前类的 pid
        data = models.Types.objects.get(id=ob.pid)
        # 获取父类下的所有子类 显示用
        data.items = models.Types.objects.filter(pid=data.id)
        # 获取当前类下的所有商品
        data.goodslist = models.Goods.objects.filter(tid = ob.id)
    # 分配数据 data 为父类-商品   ob 为当前类
    context = {'data':data,'ob':ob}

    return render(request,'home/list.html',context)

#详情
def home_info(request,gid):
    # 根据gid获取商品对象
    ob = models.Goods.objects.get(id=gid)
    # 分配数据
    context = {'goods':ob}
    # 返回模板
    return render(request,'home/info.html',context)

# 登录
def home_login(request):
    nextpath = request.GET.get('nextpath','/')
    print(nextpath)
    if (request).method == 'POST':
        # 判断验证码是否正确
        if (request.POST['vcode']).upper() != (request.session.get('verifycode')).upper():
            return render(request,'info.html',{'url':reverse('home_login'),'msg':'验证码输入错误'})
        try:
        # 根据数据手机号获取用户 get 如果没查到数据  也会报错
            ob = models.Users.objects.get(phone = request.POST['phone'])
            # 验证密码
            if check_password(request.POST['password'],ob.password):
                # 将用户信息存入session
                request.session['user'] = {'uid':ob.id,'uname':ob.username,'ustatus':ob.status}
                return render(request,'info.html',{'url':nextpath,'msg':'登录成功'})
        except:
            return render(request, 'info.html', {'url': reverse('home_login'), 'msg': '用户名或密码错误'})
    else:
        return render(request,'home/login.html')

# 退出登录
def outlogin(request):
    del request.session['user']
    return HttpResponse('<script>location.href="'+reverse('home_index')+'"</script>')

#注册
def home_register(request):
    # 判断是否是post请求
    if request.method == 'POST':
        # try:
            # 接收收据
        data = request.POST.dict()
        # 验证手机验证码是否正确
        # if request.session['msgcode'] != data['msgcode']:
        #     return HttpResponse('<script>alert("手机验证码错误");location.href="'+reverse(home_register)+'"</script>')
        # # 删除数据中的msgcode
        # data.pop('msgcode')
        # 弹出 csrf
        data.pop('csrfmiddlewaretoken')
        # 密码加密
        data['password'] = make_password(data['password'],None,'pbkdf2_sha256')
        # 执行添加
        models.Users.objects.create(**data)
        return render(request,'info.html',{'url':reverse('home_login'),'msg':'注册成功'})
        # except:
        #     return render(request, 'info.html', {'url': reverse('home_register'), 'msg': '注册失败'})
    else:
        return render(request,'home/register.html')

# 验证码
def verifycode(request):
    #引入绘图模块
    from PIL import Image, ImageDraw, ImageFont
    #引入随机函数模块
    import random
    #定义变量，用于画面的背景色、宽、高
    bgcolor = (random.randrange(20, 100), random.randrange(
       20, 100), 255)
    width = 100
    height = 25
    #创建画面对象
    im = Image.new('RGB', (width, height), bgcolor)
    #创建画笔对象
    draw = ImageDraw.Draw(im)
    #调用画笔的point()函数绘制噪点
    for i in range(0, 100):
       xy = (random.randrange(0, width), random.randrange(0, height))
       fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
       draw.point(xy, fill=fill)
    #定义验证码的备选值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    # str1 = '123456789'
    #随机选取4个值作为验证码
    rand_str = ''
    for i in range(0, 4):
       rand_str += str1[random.randrange(0, len(str1))]
    #构造字体对象
    # font = ImageFont.truetype('Arial.ttf', 23)
    font = ImageFont.truetype('arial.ttf', 23)
    #构造字体颜色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    #绘制4个字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
    draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
    draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
    draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
    #释放画笔
    del draw
    #存入session，用于做进一步验证
    request.session['verifycode'] = rand_str
    #内存文件操作
    import io
    buf = io.BytesIO()
    #将图片保存在内存中，文件类型为png
    im.save(buf, 'png')
    #将内存中的图片数据返回给客户端，MIME类型为图片png
    return HttpResponse(buf.getvalue(), 'image/png')

# 短信验证码
def sendmsg(request):
    # 接口类型：互亿无线触发短信接口，支持发送验证码短信、订单通知短信等。
    # 账户注册：请通过该地址开通账户http://user.ihuyi.com/register.html
    # 注意事项：
    # （1）调试期间，请用默认的模板进行测试，默认模板详见接口文档；
    # （2）请使用 用户名 及 APIkey来调用接口，APIkey在会员中心可以获取；
    # （3）该代码仅供接入互亿无线短信接口参考使用，客户可根据实际需要自行编写；

    # import urllib2
    import urllib
    import json
    import random
    # 用户名 查看用户名请登录用户中心->验证码、通知短信->帐户及签名设置->APIID
    account = "C02088953"
    # 密码 查看密码请登录用户中心->验证码、通知短信->帐户及签名设置->APIKEY
    password = "44004a67386d9e898d7006caadd91264"
    mobile = request.GET.get('phone')
    # 随机验证码
    code = str(random.randint(100000, 999999))
    # 把验证码存入session
    request.session['msgcode'] = code
    text = "您的验证码是：" + code + "。请不要把验证码泄露给其他人。"
    data = {'account': account, 'password': password, 'content': text, 'mobile': mobile, 'format': 'json'}
    req = urllib.request.urlopen(
        url='http://106.ihuyi.com/webservice/sms.php?method=Submit',
        data=urllib.parse.urlencode(data).encode('utf-8')
    )
    content = req.read()
    res = json.loads(content.decode('utf-8'))
    print(res)
    return HttpResponse(res)

# 个人中心
def personal(request):
    # 获取当前用户的 id
    id = request.session['user']['uid']
    # 获取数据对象
    ob = models.Users.objects.get(id=id)
     # 分配数据
    context = {'data':ob}
    return render(request,'home/center/personal.html',context)

# 修改个人信息
def up_personal(request):
    # 获取当前用户信息
    id = request.session['user']['uid']
    # 获取数据对象
    ob = models.Users.objects.get(id=id)

    #  更改数据
    ob.username = request.POST['username']
    ob.phone = request.POST['phone']
    ob.email = request.POST['email']
    # 获取文件名
    myfile = request.FILES.get('pic',None)
    # 判断是否上传了文件
    if myfile:
        #判断是否不是默认图片
        if ob.pic != '/static/pics/user.jpg' and ob.pic != '':
            # 删除原来的头像
            os.remove(BASE_DIR+ob.pic)
            # 调用文件上传方法
        ob.pic = uploads(myfile)
    #     执行更新
    ob.save()
    return render(request, 'info.html', {'msg': '修改成功', 'url': reverse('home_personal')})



